C# using 有兩種用法 一種是程式碼最上方 引用其他命名空間的程式using System.Text;
另一種 就是用using 將一段程式碼包起來 最後會執行Dispose
使用dapper拉資料時 應該常看到這樣的code
using (SqlConnection conn = new SqlConnection(connectionString))
{
var result = conn.Query<Demo>("SELECT * FROM Demo").ToList();
}
然後之前常用的套件NanoProfiler也是這樣使用 就可以取得這一段程式執行的時間
using (ProfilingSession.Current.Step("ProcessRequestAsync"))
{
//some code
}
最後看到
野人獻曝 - 極簡風格 .NET Stopwatch 計時法
黑暗執行緒 的應用 才想到可以自己寫程式應用
用黑暗執行緒的code 改出我的版本
public class StopWatchTimer : IDisposable
{
private readonly string _message;
private readonly Action<string> _logAction;
private readonly Stopwatch _stopwatch;
public StopWatchTimer(string message) : this(message, Console.WriteLine)
{
}
public StopWatchTimer(string message, Action<string> logAction)
{
_message = message;
_logAction = logAction;
_logAction.Invoke($"Start {_message}");
_stopwatch = new Stopwatch();
_stopwatch.Start();
}
public void Dispose()
{
_stopwatch.Stop();
_logAction($"Finish {_message} in {DispalyTime(_stopwatch.Elapsed)}");
_stopwatch.Reset();
}
private string DispalyTime(TimeSpan elapsed)
{
var result = new StringBuilder();
if(elapsed.Hours != 0)
{
result.Append($"{elapsed.Hours}h ");
}
if (elapsed.Minutes != 0)
{
result.Append($"{elapsed.Minutes}m ");
}
if (elapsed.Seconds != 0)
{
result.Append($"{elapsed.Seconds}s ");
}
if (elapsed.Milliseconds == 0)
{
result.Append($"{elapsed.TotalMilliseconds * 1000:n3}μs");
}
else
{
result.Append($"{elapsed.Milliseconds}ms ");
}
return result.ToString();
}
}
做了兩個調整
1.可以傳入 Action 把資料記錄到你所寫的程式,不傳的話預設是Console.WriteLine
2.DispalyTime 我有將顯示時間做點優化 看起來比較不需要在腦中轉換單位
效果像是這樣
這樣的技巧 應該有許多應用的地方 像是在部落格文章內容時
如果有 頭尾固定要加資訊是不是也可以用這樣的方式做底去開發程式呢
就留給大家去發想了
參考
關於 C# 的 using 陳述式在實務應用上的基本觀念